/*******************************************************************
  File Name      : SoftI2C.C
  Description       :
  Created on: 2019-1-14
  Author: Admin
********************************************************************/
#include "SoftI2C.h"

/********************************************************************
  Function Name   : delay_us.
  Description       : 指令延时函数，根据具体mcu指令时钟修正
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void delay_us(u8 us)
{
  u8 i;
  while (us--)
  {
    for (i = 2; i > 0; i--)
    {
      ;
    }
  }
}

/********************************************************************
  Function Name   : IIC_Init.
  Description       :
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void IIC_Init(void)
{
  //IO初始化
  SoftI2CSdaIn();
  SetSoftI2CSCL();
  SetSoftI2CSDA();
}
/********************************************************************
  Function Name   : IIC_Start.
  Description       : 产生IIC起始信号
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void IIC_Start(void)
{
  SoftI2CSdaOut();
  SetSoftI2CSDA();
  delay_us(5);
  SetSoftI2CSCL();
  delay_us(5);
  ClrSoftI2CSDA();
  delay_us(5);
}
/********************************************************************
  Function Name   : IIC_Stop.
  Description       : 产生IIC停止信号
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void IIC_Stop(void)
{
  SoftI2CSdaOut();
  ClrSoftI2CSDA();
  delay_us(5);
  SetSoftI2CSCL();
  delay_us(5);
  SetSoftI2CSDA();
  delay_us(5);
}
/********************************************************************
  Function Name   : IIC_Wait_Ack.
  Description       : 等待应答信号到来
  Input             : None.
  Output            : None.
  Return            : 1，接收应答失败. 0，接收应答成功
********************************************************************/
u8 IIC_Wait_Ack(void)
{
  u8 t = 255;
  SoftI2CSdaIn();

  SetSoftI2CSCL();
  delay_us(5);
  while (t > 0)
  {
    t--;
 //   CLRWDT();
    if (SoftI2C_SDA_L())
    {
      ClrSoftI2CSCL();
      return 1;
    }
  }

  return 0;
}
/********************************************************************
  Function Name   : IIC_Ack.
  Description       : 产生ACK应答
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void IIC_Ack(void)
{
  SoftI2CSdaOut();
  ClrSoftI2CSCL();
  delay_us(5);
  ClrSoftI2CSDA();
  delay_us(5);
  SetSoftI2CSCL();
  delay_us(5);
  ClrSoftI2CSCL();

}
/********************************************************************
  Function Name   : IIC_NAck.
  Description       : 不产生ACK应答
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void IIC_NAck(void)
{
  ClrSoftI2CSCL();
  SoftI2CSdaOut();
  SetSoftI2CSDA();
  delay_us(2);
  SetSoftI2CSCL();
  delay_us(2);
  ClrSoftI2CSCL();
}
/********************************************************************
  Function Name   : IIC_NAck.
  Description       : IIC发送一个字节
  Input             : None.
  Output            : None.
  Return            : None.
********************************************************************/
void IIC_Send_Byte(u8 r_txd)
{
  u8 i = 0;
  ClrSoftI2CSCL();
  SoftI2CSdaOut();
  delay_us(5);
  for (i = 0; i < 8; i++)
  {
    if (r_txd & 0x80)
    {
      SetSoftI2CSDA();
    } else {
      ClrSoftI2CSDA();
    }

    r_txd <<= 1;
    SetSoftI2CSCL();
    delay_us(2);
    ClrSoftI2CSCL();
    delay_us(5);
  }

  ClrSoftI2CSCL();
  delay_us(2);
  SetSoftI2CSDA();
}
/********************************************************************
  Function Name   : IIC_Read_Byte.
  Description       : 读1个字节
  Input             : None.
  Output            : None.
  Return            : receive
********************************************************************/
u8 IIC_Read_Byte(void)
{
  u8 i = 0;
  u8 readData = 0;
  SoftI2CSdaIn();
  for (i = 0; i < 8; i++)
  {
    readData <<= 1;
    ClrSoftI2CSCL();
    delay_us(5);
    SetSoftI2CSCL();
    delay_us(5);
    if (SoftI2C_SDA_H())
    {
      readData |= 1;
    } else
    {
      readData &= 0XFE;
    }
  }

  ClrSoftI2CSCL();
  delay_us(5);
  return readData;
}
